DevOps
CICD
K8s
Docker
Create a pod as follow:
name:my-nginx
image: nginx
Add an Init Container within the Pod, the role of Init Container is to create an empty file under /cache/test.txt
, Pod Containers determine whether the file exists, exiting if it does not exist.
這題提到了一個新的名詞,即Init Container
(初始化容器),這什麼呢?
Init Container
是運行於Pod Container
之前的專用容器。Init Conatiner
可以應用於一些不包含setup environment 的image
。
Init Container
和Pod Container
定義在同一個Pod YAML
中,通常是用於幫助Pod Container
運行的前置作業。像是Pod Container
需要將執行結果輸出到某一檔案,但該檔案初始並不存在,這時就可以利用Init Container
在Pod Container
運行前先將檔案創建,以供使用。
Pod
中可以有多個Pod Container
,也可以有一個或多個Init Container
,它們在啟動Pod Container
之前就已運行。它們的生命週期如下圖:
Init Container
與一般Container
基本上完全一樣,有一點點不同的地方是,Init Container
和Pod Container
不會同時存在於同一Pod
中,Pod Container
會等待Init Container
運行到完成狀態後才創建。
每個初始化容器必須成功完成工作才能啟動下一個容器 (包含初始化容器)。如果Pod
的初始化容器失敗,Kubernetes
會反復重啟Pod
,直到初始化容器成功。 但若Pod
的參數--restart=Never
,則Kubernetes
不會重新啟動Pod
。
要為Pod
指定初始化化容器,須將initContainers
欄位添加到Pod YAML
中,例如:
$ cat init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
Init Container
通常是為了完成某些特定的工作而存在的,例如:
Service
被創建
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
Server
註冊此Pod
curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(<POD_NAME>)&ip=$(<POD_IP>)'
Pod Container
等待一段時間後再創建
sleep 60
Volume
中
要讓
Container
做某些事,可以通過Command
參數
當有
Command
的Container
執行完Command
後,會進入CrashLoopBackOff
狀態,代表Container
工作完成。若想讓它維持在Running Status
,可以加上sleep
命令
回到題目,這題是要創建一個Pod Container
檢查某檔案是否存在,該檔案由Init Container
創建,若檔案不存在則退出。因此我們需要一個Pod
,裡面包含:
Pod Container
和一個 Init Container
Vloume
Init Container
於該Volume
創建檔案Pod Container
檢查該Volume
,若檔案存在則印出檔案內容,若不存在則退出$ vim q11-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args: ["-c", "cat /cache/test.txt && sleep 3600000"]
volumeMounts:
- mountPath: /cache
name: cache-volume
initContainers:
- name: init-nginx
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ['touch', '/cache/test.txt']
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
$ kubectl apply -f q11-pod.yaml
touch
命令用於建立空檔案
當Pod Container
能cat
到該檔案,代表檔案存在,則會sleep 3600000
(讓它維持在Running Status
)
若無法cat
,代表/cache/test.txt
不存在,則Pod
會處於Error Status
,算是達到題目的要求退出
今天介紹了Init Container
的考題,這類題目還算簡單,比較要注意的是Command
的寫法,有時候之要如何使用Init Container
,但卻不知道Command
怎麼下就很頭痛了!好啦,今天就到這囉~ 謝謝大家~
You can find me on